/*
	Dimension by HTML5 UP
	html5up.net | @ajlkn
	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
*/
(function ($) {
	skel.breakpoints({
		xlarge: '(max-width: 1680px)',
		large: '(max-width: 1280px)',
		medium: '(max-width: 980px)',
		small: '(max-width: 736px)',
		xsmall: '(max-width: 480px)',
		xxsmall: '(max-width: 360px)'
	});
	$(function () {
		var $window = $(window),
			$body = $('body'),
			$wrapper = $('#wrapper'),
			$header = $('#header'),
			$footer = $('#footer'),
			$main = $('#main'),
			$main_articles = $main.children('article');
		// Disable animations/transitions until the page has loaded.
		$body.addClass('is-loading');
		$window.on('load', function () {
			window.setTimeout(function () {
				$body.removeClass('is-loading');
			}, 100);
		});
		// Fix: Placeholder polyfill.
		$('form').placeholder();
		// Fix: Flexbox min-height bug on IE.
		if (skel.vars.IEVersion < 12) {
			var flexboxFixTimeoutId;
			$window.on('resize.flexbox-fix', function () {
				clearTimeout(flexboxFixTimeoutId);
				flexboxFixTimeoutId = setTimeout(function () {
					if ($wrapper.prop('scrollHeight') > $window.height())
						$wrapper.css('height', 'auto');
					else
						$wrapper.css('height', '100vh');
				}, 250);
			}).triggerHandler('resize.flexbox-fix');
		}
		// Nav.
		var $nav = $header.children('nav'),
			$nav_li = $nav.find('li');
		// Add "middle" alignment classes if we're dealing with an even number of items.
		if ($nav_li.length % 2 == 0) {
			$nav.addClass('use-middle');
			$nav_li.eq(($nav_li.length / 2)).addClass('is-middle');
		}
		// Main.
		var delay = 325,
			locked = false;
		// Methods.
		$main._show = function (id, initial) {
			var $article = $main_articles.filter('#' + id);
			// No such article? Bail.
			if ($article.length == 0)
				return;
			// Handle lock.
			// Already locked? Speed through "show" steps w/o delays.
			if (locked || (typeof initial != 'undefined' && initial === true)) {
				// Mark as switching.
				$body.addClass('is-switching');
				// Mark as visible.
				$body.addClass('is-article-visible');
				// Deactivate all articles (just in case one's already active).
				$main_articles.removeClass('active');
				// Hide header, footer.
				$header.hide();
				$footer.hide();
				// Show main, article.
				$main.show();
				$article.show();
				// Activate article.
				$article.addClass('active');
				// Unlock.
				locked = false;
				// Unmark as switching.
				setTimeout(function () {
					$body.removeClass('is-switching');
				}, (initial ? 1000 : 0));
				return;
			}
			// Lock.
			locked = true;
			// Article already visible? Just swap articles.
			if ($body.hasClass('is-article-visible')) {
				// Deactivate current article.
				var $currentArticle = $main_articles.filter('.active');
				$currentArticle.removeClass('active');
				// Show article.
				setTimeout(function () {
					// Hide current article.
					$currentArticle.hide();
					// Show article.
					$article.show();
					// Activate article.
					setTimeout(function () {
						$article.addClass('active');
						// Window stuff.
						$window
							.scrollTop(0)
							.triggerHandler('resize.flexbox-fix');
						// Unlock.
						setTimeout(function () {
							locked = false;
						}, delay);
					}, 25);
				}, delay);
			}
			// Otherwise, handle as normal.
			else {
				// Mark as visible.
				$body
					.addClass('is-article-visible');
				// Show article.
				setTimeout(function () {
					// Hide header, footer.
					$header.hide();
					$footer.hide();
					// Show main, article.
					$main.show();
					$article.show();
					// Activate article.
					setTimeout(function () {
						$article.addClass('active');
						// Window stuff.
						$window
							.scrollTop(0)
							.triggerHandler('resize.flexbox-fix');
						// Unlock.
						setTimeout(function () {
							locked = false;
						}, delay);
					}, 25);
				}, delay);
			}
		};
		$main._hide = function (addState) {
			var $article = $main_articles.filter('.active');
			// Article not visible? Bail.
			if (!$body.hasClass('is-article-visible'))
				return;
			// Add state?
			if (typeof addState != 'undefined' &&
				addState === true)
				history.pushState(null, null, '#');
			// Handle lock.
			// Already locked? Speed through "hide" steps w/o delays.
			if (locked) {
				// Mark as switching.
				$body.addClass('is-switching');
				// Deactivate article.
				$article.removeClass('active');
				// Hide article, main.
				$article.hide();
				$main.hide();
				// Show footer, header.
				$footer.show();
				$header.show();
				// Unmark as visible.
				$body.removeClass('is-article-visible');
				// Unlock.
				locked = false;
				// Unmark as switching.
				$body.removeClass('is-switching');
				// Window stuff.
				$window
					.scrollTop(0)
					.triggerHandler('resize.flexbox-fix');
				return;
			}
			// Lock.
			locked = true;
			// Deactivate article.
			$article.removeClass('active');
			// Hide article.
			setTimeout(function () {
				// Hide article, main.
				$article.hide();
				$main.hide();
				// Show footer, header.
				$footer.show();
				$header.show();
				// Unmark as visible.
				setTimeout(function () {
					$body.removeClass('is-article-visible');
					// Window stuff.
					$window
						.scrollTop(0)
						.triggerHandler('resize.flexbox-fix');
					// Unlock.
					setTimeout(function () {
						locked = false;
					}, delay);
				}, 25);
			}, delay);
		};
		// Articles.
		$main_articles.each(function () {
			var $this = $(this);
			// Close.
			$('<div class="close">Close</div>')
				.appendTo($this)
				.on('click', function () {
					location.hash = '';
				});
			// Prevent clicks from inside article from bubbling.
			$this.on('click', function (event) {
				event.stopPropagation();
			});
		});
		// Events.
		$body.on('click', function (event) {
			// Article visible? Hide.
			if ($body.hasClass('is-article-visible'))
				$main._hide(true);
		});
		$window.on('keyup', function (event) {
			switch (event.keyCode) {
				case 27:
					// Article visible? Hide.
					if ($body.hasClass('is-article-visible'))
						$main._hide(true);
					break;
				default:
					break;
			}
		});
		$window.on('hashchange', function (event) {
			// Empty hash?
			if (location.hash == '' ||
				location.hash == '#') {
				// Prevent default.
				event.preventDefault();
				event.stopPropagation();
				// Hide.
				$main._hide();
			}
			// Otherwise, check for a matching article.
			else if ($main_articles.filter(location.hash).length > 0) {
				// Prevent default.
				event.preventDefault();
				event.stopPropagation();
				// Show article.
				$main._show(location.hash.substr(1));
			}
		});
		// Scroll restoration.
		// This prevents the page from scrolling back to the top on a hashchange.
		if ('scrollRestoration' in history)
			history.scrollRestoration = 'manual';
		else {
			var oldScrollPos = 0,
				scrollPos = 0,
				$htmlbody = $('html,body');
			$window
				.on('scroll', function () {
					oldScrollPos = scrollPos;
					scrollPos = $htmlbody.scrollTop();
				})
				.on('hashchange', function () {
					$window.scrollTop(oldScrollPos);
				});
		}
		// Initialize.
		// Hide main, articles.
		$main.hide();
		$main_articles.hide();
		// Initial article.
		if (location.hash != '' &&
			location.hash != '#')
			$window.on('load', function () {
				$main._show(location.hash.substr(1), true);
			});
	});
})(jQuery);